package br.com.ianalise.negocio.fachada;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import br.com.ianalise.negocio.controlador.ControladorConfigRede;
import br.com.ianalise.negocio.controlador.ControladorPaciente;
import br.com.ianalise.negocio.excecoes.IAnaliseException;
import br.com.ianalise.negocio.pojo.ConfigRede;
import br.com.ianalise.negocio.pojo.Paciente;
import br.com.ianalise.outros.IObjetoRemoto;

public class Fachada {

	private static Fachada instancia = null;
	
	private ControladorPaciente conCliente = null;
	private ControladorConfigRede conConfigRede = null;

	private ConfigRede configRede;
	
	public static Fachada getInstancia() {
	        if (instancia == null) {
	                instancia = new Fachada();
	        }
	        return instancia;
	}
	
	public Fachada() {
	        conCliente = new ControladorPaciente();
	        conConfigRede = new ControladorConfigRede();
	}
	
	public boolean cadastrarPaciente(Paciente paciente) throws IAnaliseException {
		configRede = Fachada.getInstancia().consultarConfig();
		if(configRede.getTipoNo().equals("servidor")){
			return conCliente.cadastrarCliente(paciente);
		} else {
			try {
				
				IObjetoRemoto objetoRemoto = (IObjetoRemoto) Naming.lookup("rmi://"+configRede.getIpServidor()+"/iAnalise");
				return objetoRemoto.instanciaFachada().cadastrarPaciente(paciente);
				
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					throw new IAnaliseException(e.toString());
				} catch (IAnaliseException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					throw new IAnaliseException(e.toString());
				} catch (IAnaliseException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
			} catch (NotBoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					throw new IAnaliseException(e.toString());
				} catch (IAnaliseException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
			}
			return false;
		}
	}
	
	public boolean alterarConfigRede(ConfigRede configRede) throws IAnaliseException {
	    return conConfigRede.alterarConfigRede(configRede);
	}
	
	public ConfigRede consultarConfig() throws IAnaliseException {		
		return conConfigRede.consultarConfigRede(1);		
	}

}